# pmim_user.db

胖喵输入法用户数据库.

数据库文件位置: `~/.config/pmim/pmim_user.db`

数据库格式: `deno-kv` <https://deno.com/kv>

## 数据库结构

- 1 元数据
- 2 用户输入数据
- 3 输入测量
- 4 配置

### 1 元数据

关于数据库自身的描述数据.

- `["pmim_db", "version"]` `"pmim_user_db version 0.1.0"`

  数据库版本字符串.

- `["pmim_db", "v"]` `{}`

  详细版本信息. 举例:

  ```json
  {
    "pmim": "pmim version 0.1.0",
    "deno_version": {
      "deno": "1.40.4",
      "v8": "12.1.285.6",
      "typescript": "5.3.3"
    },
    "_last_update": "2024-02-14T11:23:38.546Z"
  }
  ```

- `["pmim_db", "u_ulid"]` `""`

  用户数据库 ULID 标记. <https://github.com/ulid/spec>

  用于唯一标识一个用户数据库.

### 2 用户输入数据

学习用户的输入习惯, 为了更好的预测.

记录用户输入字词的频率, 以及最近使用时间.

- `["data_u", "f_c", pinyin, 字]` `count`

  用户字表 (间接字) 频率.

- `["data_u", "r_c", 日期, pinyin, 字]` `时间`

  用户字表 (间接字) 最近.

- `["data_u", "f_d", pin_yin, 词]` `count`

  用户词表 频率.

- `["data_u", "r_d", 日期, pin_yin, 词]` `时间`

  用户词表 最近.

- `["data_u", "f_ascii", c]` `count`

  用户符号表 ASCII 频率.

- `["data_u", "r_ascii", 日期, c]` `时间`

  用户符号表 ASCII 最近.

- `["data_u", "f_o", id, t]` `count`

  用户扩展表 频率.

- `["data_u", "r_o", 日期, id, t]` `时间`

  用户扩展表 最近.

---

注:

- `pin_yin`: 比如 `"ce_shi"`

- `日期`: 比如 `2024-02-19` (UTC)

- `时间`: 当天的秒数 (0 ~ 86400)

## 3 输入测量

输入测量 (统计) 功能. 每分钟产生一组测量数据.

- `["data_u", "m", 日期, "c.n", 时分]` `n`

  提交次数 (累计).

  这一分钟一共调用了多少次 `commit` 接口.

- `["data_u", "m", 日期, "c.c", 时分]` `n`

  (仅汉字输入) 提交次数 (累计).

  这一分钟一共调用了多少次 `commit` 接口 (`c = c`).

- `["data_u", "m", 日期, "c.t", 时分]` `n`

  (仅汉字输入) 输入字数 (累计).

  这一分钟一共输入了多少个汉字.

- `["data_u", "m", 日期, "c.t_m", 时分]` `n`

  (仅汉字输入) 输入字数 (最小).

  每次提交最小的汉字个数.

- `["data_u", "m", 日期, "c.t_M", 时分]` `n`

  (仅汉字输入) 输入字数 (最大).

  每次提交最大的汉字个数.

- `["data_u", "m", 日期, "i.n", 时分]` `n`

  (仅汉字输入) 候选项序号: 数量 (累计).

  每次提交有几个候选项序号. 相当于一次提交经过了几次选择.

- `["data_u", "m", 日期, "i.n_m", 时分]` `n`

  (仅汉字输入) 候选项序号: 数量 (最小).

  每次提交有几个候选项序号: 最小值.

- `["data_u", "m", 日期, "i.n_M", 时分]` `n`

  (仅汉字输入) 候选项序号: 数量 (最大).

  每次提交有几个候选项序号: 最大值.

- `["data_u", "m", 日期, "i.c", 时分]` `n`

  (仅汉字输入) 候选项序号: 综合 (累计).

  所有候选项序号的累计.

- `["data_u", "m", 日期, "i.c_m", 时分]` `n`

  (仅汉字输入) 候选项序号: 综合 (最小).

  所有候选项序号的最小值.

- `["data_u", "m", 日期, "i.c_M", 时分]` `n`

  (仅汉字输入) 候选项序号: 综合 (最大).

  所有候选项序号的最大值.

- `["data_u", "m", 日期, "i.c1", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅一项 (累计).

  所有候选项序号的累计.

- `["data_u", "m", 日期, "i.c1_m", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅一项 (最小).

  所有候选项序号的最小值.

- `["data_u", "m", 日期, "i.c1_M", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅一项 (最大).

  所有候选项序号的最大值.

- `["data_u", "m", 日期, "i.c1_n", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅一项 (次数).

- `["data_u", "m", 日期, "i.cn", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅多项 (累计).

  所有候选项序号的累计.

- `["data_u", "m", 日期, "i.cn_m", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅多项 (最小).

  所有候选项序号的最小值.

- `["data_u", "m", 日期, "i.cn_M", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅多项 (最大).

  所有候选项序号的最大值.

- `["data_u", "m", 日期, "i.cn_n", 时分]` `n`

  (仅汉字输入) 候选项序号: 仅多项 (次数).

- `["data_u", "m", 日期, "t.p", 时分]` `n`

  (仅汉字输入) 拼音切分 响应时间 ms (累计).

- `["data_u", "m", 日期, "t.p_m", 时分]` `n`

  (仅汉字输入) 拼音切分 响应时间 (最小).

- `["data_u", "m", 日期, "t.p_M", 时分]` `n`

  (仅汉字输入) 拼音切分 响应时间 (最大).

- `["data_u", "m", 日期, "t.p_n", 时分]` `n`

  (仅汉字输入) 拼音切分 响应时间 (次数).

- `["data_u", "m", 日期, "t.c", 时分]` `n`

  (仅汉字输入) 拼音转汉字 响应时间 ms (累计).

- `["data_u", "m", 日期, "t.c_m", 时分]` `n`

  (仅汉字输入) 拼音转汉字 响应时间 (最小).

- `["data_u", "m", 日期, "t.c_M", 时分]` `n`

  (仅汉字输入) 拼音转汉字 响应时间 (最大).

- `["data_u", "m", 日期, "t.c_n", 时分]` `n`

  (仅汉字输入) 拼音转汉字 响应时间 (次数).

---

注:

- `日期`: 比如 `2024-02-25` (UTC)

- `时分`: 比如 `0041` (UTC)

- `n`: 计数 (BigInt)

## 4 配置

保存用户配置数据.

- `["data_u", "conf", k]` `v`

  配置项 (K=V).

TODO
